package com.browsesoft.adapter;

import java.io.IOException;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;

import com.browsesoft.EntityManager;
import com.browsesoft.ExtendElement;
import com.browsesoft.ManagerGroup;
import com.browsesoft.Tools;
import com.browsesoft.htmlcomponent.HTMLBasicComponent;
import com.browsesoft.htmlcomponent.HTMLPage;
import com.browsesoft.htmlcomponent.HTMLTableModel;
import com.browsesoft.htmlcomponent.Template;
import com.browsesoft.htmlcomponent.TemplateManager;
import com.browsesoft.user.User;

/**
 * 日程安排表
 */
public class CalendarTableModel implements HTMLTableModel {
	static private Logger logger = null;

	static {
		try {
			logger = Logger.getLogger("CalendarTableModel");
			logger.addHandler(new FileHandler(Tools.getAbsolutePath()
					+ "/logs/CalendarTableModel%u.html"));
			logger.setUseParentHandlers(false);
		} catch (SecurityException ex) {
		} catch (IOException ex) {
		}
	}

	/**
	 * 对应的组件
	 */
	protected HTMLBasicComponent component = null;

	/**
	 * 表格应拥有日程安排
	 */
	protected LinkedList calendars = new LinkedList();

	/**
	 * 要显示的所有字段中文名
	 */
	protected LinkedList cnames = new LinkedList();

	/**
	 * 对应的表单模板
	 */
	protected String form;

	/**
	 * 查询条件
	 */
	protected String condition = null;

	/**
	 * 要显示的所有字段英文名
	 */
	protected LinkedList enames = new LinkedList();

	/**
	 * 父id
	 */
	protected String parentID = null;

	/**
	 * 数据库表名
	 */
	protected String tableName = null;

	/**
	 * 构造方法
	 */
	public CalendarTableModel() throws Exception {
	}

	/**
	 * 初始化model
	 * 
	 * @throws Exception
	 */
	public void init(HttpServletRequest request) throws Exception {
		// 得到模板中的form元素中的form属性值
		Element formElement = this.component.getElement();
		form = formElement.getAttribute("form");
		// 得到所用到的表明
		tableName = formElement.getAttribute("tablename");
		// 如果form属性值存在
		if (form != null && !form.equals("")) {
			// 得到模板管理嚣
			TemplateManager manager = (TemplateManager) ManagerGroup
					.getManagerGroup().getManager("template");
			// 由form属性值生成页面
			Template t = manager.getTemplateByName(form);
			// 得到模板文档,
			Document document = t.getDocument();
			// 解析文档,找出需要处理的根元素
			Element root = (Element) document.getElementsByTagName("body")
					.item(0);
			// 找到所有显示的组件
			LinkedList v = ExtendElement.findElements(root, "show", "show");
			// 生成SQL语句
			for (int i = 0; i < v.size(); i++) {
				Element element = (Element) v.get(i);
				enames.add(element.getAttribute("name"));
				cnames.add(element.getAttribute("cname"));
			}
		}
	}

	/**
	 * 得到列数
	 * 
	 * @return 列数
	 */
	public int getColumnCount() {
		return this.cnames.size() + 3;
	}

	/**
	 * 得到列的名称
	 * 
	 * @param index
	 *            列号
	 * @return 列的名称
	 */
	public String getColumnName(int index) {
		if (index < cnames.size()) {
			return (String) cnames.get(index);
		} else {
			return "";
		}
	}

	/**
	 * 得到列的英文名
	 * 
	 * @param index
	 *            列号
	 * @return 列的英文名
	 */
	public String getColumnEname(int index) {
		if (index < enames.size()) {
			return (String) enames.get(index);
		} else {
			return "";
		}
	}

	public Object getDatas() {
		return this.calendars;
	}

	/**
	 * 得到行数
	 * 
	 * @return 行数
	 */
	public int getRowCount() {
		return this.calendars.size();
	}

	/**
	 * 得到某列的操作类型
	 * 
	 * @return 类型
	 */
	public String getType(int col) {
		if (col < cnames.size()) {
			return "td";
		} else if (col == cnames.size()) {
			return "detail";
		} else if (col == cnames.size() + 1) {
			return "modify";
		} else if (col == cnames.size() + 2) {
			return "delete";
		}
		return null;
	}

	/**
	 * 修改单元值
	 */
	public void modifyCellValue(Element td, Document doc, int row, int col) {
		try {
			CalendarFormModel calendar = (CalendarFormModel) this.calendars
					.get(row);
			// 显示其他
			if (col < cnames.size()) {
				// 得到链接
				LinkedList nl = ExtendElement.findElements(td, "type", "link");
				if (nl.size() != 0) {
					Element link = (Element) nl.get(0);
					String value = link.getAttribute("onclick");
					value = value.replaceAll("point=", "point="
							+ calendar.getID());
					link.setAttribute("onclick", value);
				}
				String temp = (String) enames.get(col);
				if (temp != null && !temp.equals("")) {
					ExtendElement.replaceElementContext(td, doc
							.createTextNode((String) calendar.getAttributes()
									.get(temp)));
				} else {
					ExtendElement.replaceElementContext(td, doc
							.createTextNode(""));
				}
			}
			// 详细信息
			else if (col == cnames.size()) {
				Element e = (Element) ExtendElement.findElements(td, "type",
						"link").get(0);
				String str = e.getAttribute("onclick");
				str = str.replaceAll("id=", "id=" + calendar.getID());
				str = str.replaceAll("templatename=", "templatename=" + form);
				e.setAttribute("onclick", str);
			}
			// 修改
			else if (col == cnames.size() + 1) {
				Element e = (Element) ExtendElement.findElements(td, "type",
						"link").get(0);
				String str = e.getAttribute("onclick");
				str = str.replaceAll("id=", "id=" + calendar.getID());
				str = str.replaceAll("templatename=", "templatename=" + form);
				e.setAttribute("onclick", str);
			}
			// 删除
			else if (col == cnames.size() + 2) {
				Element e = (Element) ExtendElement.findElements(td, "type",
						"link").get(0);
				String str = e.getAttribute("onclick");
				str = str.replaceAll("id=", "id=" + calendar.getID());
				// 设置删除的表名
				str = str.replaceAll("tablename=", "tablename=" + tableName);
				e.setAttribute("onclick", str);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 建立关系
	 */
	public void setCondition(String s) {
	}

	/**
	 * 更新页面元素
	 */
	public void updatePageElement(HTMLBasicComponent component)
			throws Exception {
	}

	/**
	 * 设置传递的参数
	 * 
	 * @param request
	 */
	public void service(HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		long time = System.currentTimeMillis();
		User user = (User) request.getSession().getAttribute("loginUser");
		String userid = user.getID();
		if (parentID == null) {
			parentID = request.getParameter("point");
		}
		// 取指定的日期
		if (parentID != null && !parentID.equals("")) {
			Element element = (Element) this.component.getPage().getDocument()
					.getElementsByTagName("body").item(0);
			Element e = (Element) ExtendElement.findElements(element, "type",
					"dutydate").get(0);
			String y = parentID.substring(0, 4);
			String m = parentID.substring(4, 6);
			int mm = Integer.parseInt(m) + 1;
			String d = parentID.substring(6, 8);
			y = y + "年" + mm + "月" + d + "日";
			Text text = ((HTMLPage) this.component.getPage()).getDocument()
					.createTextNode(y);
			ExtendElement.replaceElementContext(e, text);
		}
		Hashtable ht = new Hashtable();
		// 添加用户id
		ht.put("userid", userid);
		// 有日期
		if (parentID != null) {
			// 添加日期
			ht.put("parentid", parentID);
		}
		// 得到实体管理器
		EntityManager entitymanager = (EntityManager) ManagerGroup
				.getManagerGroup().getManager("entity");
		// 得到符合条件的实体
		this.calendars = entitymanager.getObjects(
				"com.browsesoft.adapter.CalendarFormModel", ht);
		this.calendars = this.compositor(this.calendars, "starthour");
		// 打印取得符合条件的日程安排的时间
		long st = System.currentTimeMillis() - time;
		time = System.currentTimeMillis();
		if (st > 100) {
			logger.log(Level.INFO, "取得符合条件的日程安排的时间:" + st);
		}
	}

	/**
	 * 设置模型所对应的组件
	 * 
	 * @param component
	 *            对应的组件
	 */
	public void setComponent(HTMLBasicComponent component) {
		this.component = component;
	}

	/**
	 * 按时间的大小排序
	 */
	public LinkedList compositor(LinkedList list, String condition) {
		LinkedList result = new LinkedList();
		// 时间考前的日期
		CalendarFormModel previous;
		// 时间考前的日期的日期字符串
		String previousStr;
		// 临时的一个日期
		CalendarFormModel temp;
		// 临时的一个日期的日期字符串
		String tempStr;
		for (int i = 0; i < list.size();) {
			// 获得第一个日期
			previous = (CalendarFormModel) list.get(i);
			// 获得这个日期的某格属性
			previousStr = (String) previous.getAttributes().get(condition);
			for (int j = i + 1; j < list.size(); j++) {
				// 得到下一个日期
				temp = (CalendarFormModel) list.get(j);
				// 获得这个日期的某格属性
				tempStr = (String) temp.getAttributes().get(condition);
				// 如果这个临时的日期比较小，把它付给previous
				if (tempStr.compareTo(previousStr) < 0) {
					previous = temp;
				}
			}
			// 添加到结果记录
			result.add(previous);
			// 从原来的链表中删除
			list.remove(previous);
		}
		return result;
	}

	/**
	 * 按时间的大小排序
	 */
	public LinkedList compositor(LinkedList list, String fristCondition,
			String secondCondition) {
		LinkedList result = new LinkedList();
		// 时间考前的日期
		CalendarFormModel previous;
		// 时间考前的日期的日期字符串
		String previousStr;
		// 临时的一个日期
		CalendarFormModel temp;
		// 临时的一个日期的日期字符串
		String tempStr;
		for (int i = 0; i < list.size();) {
			// 获得第一个日期
			previous = (CalendarFormModel) list.get(i);
			// 获得这个日期的某格属性
			previousStr = (String) previous.getAttributes().get(fristCondition);
			previousStr = previousStr
					+ (String) previous.getAttributes().get(secondCondition);
			for (int j = i + 1; j < list.size(); j++) {
				// 得到下一个日期
				temp = (CalendarFormModel) list.get(j);
				// 获得这个日期的某格属性
				tempStr = (String) temp.getAttributes().get(fristCondition);
				tempStr = tempStr
						+ (String) temp.getAttributes().get(secondCondition);
				// 如果这个临时的日期比较小，把它付给previous
				if (tempStr.compareTo(previousStr) < 0) {
					previous = temp;
				}
			}
			// 添加到结果记录
			result.add(previous);
			// 从原来的链表中删除
			list.remove(previous);
		}
		return result;
	}
}